package com.atdel.demo29;


import java.lang.reflect.Field;

/**
 * @BelongsProject: java_study
 * @BelongsPackage: com.atdel.demo29
 * @Author: Del
 * @CreateTime: 2025-03-30  16:26
 * @Description: 创建一个学生类，有姓名和年龄两个字段，
 * 使用上面定义的注解设置年龄不能低于18岁，否则抛出异常
 * @Version: 1.0
 */
public class Student {

    // 使用注解设置年龄的最小值，如果小于18岁，则抛出异常
    @AnnotationDemo(value = 18)
    private int age;

    // 姓名字段
    private String name;

    // 构造方法，初始化年龄和姓名
    public Student(int age, String name) throws Exception {
        this.setAge(age);
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    // 设置年龄的方法，如果小于18岁，则抛出异常
    public void setAge(int age) throws Exception {
        this.age = age;
        validateAge(); // 校验年龄
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    /**
     * 使用反射机制校验年龄是否符合注解要求。
     */
    private void validateAge() throws Exception {
        // 获取当前类的属性
        Field field = getClass().getDeclaredField("age");
        // 获取属性的注解
        AnnotationDemo annotation = field.getAnnotation(AnnotationDemo.class);

        // 如果注解不为空，则获取注解的 value 属性，即最小值
        if (annotation != null) {
            int minValue = annotation.value();
            if (this.age < minValue) {
                throw new Exception("年龄不能低于" + minValue + "岁");
            }
        }
    }
}
